package displayboardinfo.entities;

import java.util.List;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.OneToMany;
import javax.persistence.Table;
import javax.persistence.UniqueConstraint;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlElementWrapper;
import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.XmlType;

/**
 *  
 * Klasa reprezentująca pacjenta zarejestrowanego w klinice.
 *
 * @author Artur Jaworski
 */
@Entity
@Table ( name = "Patients", uniqueConstraints = {@UniqueConstraint(columnNames={"PESEL"})} )
@XmlRootElement
@XmlType(propOrder = { "id", "pesel", "name", "surname", "visits" })
public class Patient {
	@Id
	@Column
	@GeneratedValue(strategy=GenerationType.AUTO)
	protected Long id;
	
	@Column( name = "PESEL", nullable = false )
	protected String pesel;
	
	@Column( name = "name", nullable = false )
	protected String name;
	
	@Column( name = "surname", nullable = false )
	protected String surname;
	
	@OneToMany ( mappedBy = "patient" )
	protected List<Visit> visits;
	
	/**
	 * Domyślny konstruktor bezargumentowy.
	 */
	public Patient() {

	}
	
	/**
	 * Pobranie unikalnego numeru ID pacjenta. 
	 * 
	 * @return unikalny numer ID
	 */
	public Long getId() {
		return id;
	}

	/**
	 * Ustawienie unikalnego numeru ID pacjenta.
	 * Ręczne ustawianie numeru ID powinno być zawsze robione z rozwagą. 
	 * 
	 * @param id unikalny numer ID
	 */
	public void setId(Long id) {
		this.id = id;
	}

	/**
	 * Pobranie numeru PESEL pacjenta. 
	 * 
	 * @return PESEL pacjenta
	 */
	public String getPesel() {
		return pesel;
	}

	/**
	 * Ustawienie numeru PESEL pacjenta. 
	 * 
	 * @param pesel PESEL pacjenta
	 */
	public void setPesel(String pesel) {
		this.pesel = pesel;
	}

	/**
	 * Pobranie imienia pacjenta. 
	 * 
	 * @return imię pacjenta
	 */
	public String getName() {
		return name;
	}

	/**
	 * Ustawienie imienia pacjenta. 
	 * 
	 * @param name imię pacjenta
	 */
	public void setName(String name) {
		this.name = name;
	}

	/**
	 * Pobranie nazwiska pacjenta. 
	 * 
	 * @return nazwisko pacjenta
	 */
	public String getSurname() {
		return surname;
	}

	/**
	 * Ustawienie nazwiska pacjenta. 
	 * 
	 * @param surname nazwisko pacjenta
	 */
	public void setSurname(String surname) {
		this.surname = surname;
	}

	/**
	 * Pobranie listy wizyt pacjenta. 
	 * 
	 * @return lista wizyt pacjenta
	 */
	@XmlElementWrapper ( name = "visits" )
	@XmlElement ( name = "visit" )
	public List<Visit> getVisits() {
		return visits;
	}

	/**
	 * Ustawienie listy wizyt pacjenta. 
	 * 
	 * @param visits lista wizyt pacjenta
	 */
	public void setVisits(List<Visit> visits) {
		this.visits = visits;
	}
	
	/**
	 * Konwersja obiektu pacjenta na łatwy do zrozumienia łańcuch znaków.
	 * 
	 * @return sformatowany łańcuch znaków
	 */
	@Override
	public String toString() {
		String text = new String();
		
		text += "\nid:" + id + "\n" +
				"PESEL:" + pesel + "\n" +
				"name:" + name + "\n" +
				"surname:" + surname;
		if (visits != null && visits.size() > 0){
				text += "\nvisits:";
			for (Visit v : visits)
				text += v.getId() + ",";
		}
		
		return text;
	}
}
